package app.caihan.scframe.util

import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.activity.ComponentActivity
import androidx.fragment.app.Fragment
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import com.just.agentweb.AgentWeb

/**
 * Agentweb辅助类
 * 在调用[loadUrl]的时候使用lifecycle.addObserver(AgentwebHelper())绑定生命周期
 *
 * 你中招了吗？ Kotlin 一个隐藏的问题 [https://juejin.im/post/6856954554718617614]
 * 使用 T.let 会遇到什么问题？
 * 为什么会造成这个问题？
 * 如何解决这个问题？
 * 为什么使用 T.apply 可以解决这个问题？
 * T.apply 和 T.let 有什么区别？
 * 如何区分 run, with, let, also, apply？
 * Kotlin 如何交换两个变量？
 *
 * @author Seven-C
 * @date 2020/7/27
 */
class AgentwebHelper(
    val activity: ComponentActivity,
    private val webViewGroup: ViewGroup,
    private val lp: ViewGroup.LayoutParams = LinearLayout.LayoutParams(-1, -1)
) : DefaultLifecycleObserver {

    constructor(
        fragment: Fragment,
        webViewGroup: ViewGroup,
        lp: ViewGroup.LayoutParams = LinearLayout.LayoutParams(-1, -1)
    ) : this(fragment.requireActivity(), webViewGroup, lp) {
        this.fragment = fragment
    }

    private var fragment: Fragment? = null
    private var mAgentWeb: AgentWeb? = null

    private var preWeb: AgentWeb.PreAgentWeb? = null

    init {

        fragment?.apply {
            preWeb = AgentWeb.with(this)
                .setAgentWebParent(webViewGroup, lp)
                .useDefaultIndicator()
                .createAgentWeb()
                .ready()
        } ?: run {
            preWeb = AgentWeb.with(this.activity)
                .setAgentWebParent(webViewGroup, lp)
                .useDefaultIndicator()
                .createAgentWeb()
                .ready()
        }
    }

    open fun getAgentWeb(): AgentWeb? {
        return mAgentWeb
    }

    open fun getPreWeb(): AgentWeb.PreAgentWeb? {
        return preWeb
    }

    /**
     * 返回按钮处理
     * 如果页面可以回退的话,会调用内部的回退机制,否走的话走上层逻辑
     * @param isBack 是否执行内部回退页面的逻辑,默认true
     */
    open fun onBack(isBack: Boolean = true, action: () -> Unit) {
        mAgentWeb?.let { web ->
            if (isBack && web.webCreator.webView.canGoBack()) {
                web.webCreator.webView.goBack()
            } else {
                action.invoke()
            }
        }
    }

    open fun loadUrl(url: String) {
        //加载网页
        preWeb?.apply {
            mAgentWeb = this.go(url)
            fragment?.apply {
                lifecycle.addObserver(this@AgentwebHelper)
            } ?: run {
                activity.lifecycle.addObserver(this@AgentwebHelper)
            }
        }
    }


    override fun onResume(owner: LifecycleOwner) {
        mAgentWeb?.apply {
            webLifeCycle.onResume()
        }
    }

    override fun onPause(owner: LifecycleOwner) {
        mAgentWeb?.apply {
            webLifeCycle.onPause()
        }
    }

    override fun onDestroy(owner: LifecycleOwner) {
        mAgentWeb?.apply {
            webLifeCycle.onDestroy()
        }
    }
}